﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using PortalMainService.Persistencia;
using PortalMainService.Dominio;
using System.Web;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace PortalMainService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Usuario" in code, svc and config file together.
    public class Usuarios : IUsuario
    {
        private UsuarioDAO usuarioDAO = null;
        private UsuarioDAO UsuarioDAO {
            get 
            {
                if (this.usuarioDAO == null) {
                    this.usuarioDAO = new UsuarioDAO();
                }
                return this.usuarioDAO;
            }
        }

        //public Usuario crearUsuario(string email, string password, string nombre, string apellido, string ocupacion, string carrera)
        //{
        //    Usuario nuevoUsuario = new Usuario()
        //    {
        //        Email = email,
        //        Password = password, 
        //        Nombre = nombre,
        //        Apellido = apellido,
        //        Ocupacion = ocupacion,
        //        Carrera = carrera
        //    };
        //    return this.UsuarioDAO.Crear(nuevoUsuario);
        //}

        //public Usuario obtenerUsuario(string email)
        //{
        //    return this.UsuarioDAO.Obtener(email);
        //}

        //public Usuario modificarUsuario(string email, string password, string nombre, string apellido, string ocupacion, string carrera)
        //{
        //    Usuario oUsuario = this.obtenerUsuario(email);
        //    if (oUsuario!= null){
        //        oUsuario.Password = password;
        //        oUsuario.Nombre = nombre;
        //        oUsuario.Apellido = apellido;
        //        oUsuario.Ocupacion = ocupacion;
        //        oUsuario.Carrera = carrera;
        //        oUsuario = this.UsuarioDAO.Modificar(oUsuario);
        //    }
        //    return oUsuario;
        //}

        //public void eliminarUsuario(string email)
        //{
        //    Usuario oUsuario = UsuarioDAO.Obtener(email);
        //    this.UsuarioDAO.Eliminar(oUsuario);
        //}

        //public List<Usuario> listarUsuarios()
        //{
        //    return UsuarioDAO.ListarTodos().ToList();
        //}

        private Usuario ProcesarUsuarioFacebook (string code)
        {
            string secret = System.Configuration.ConfigurationManager.AppSettings["fb_secret"];
            string appID = System.Configuration.ConfigurationManager.AppSettings["fb_appId"];
            string url_redirect = System.Configuration.ConfigurationManager.AppSettings["fb_redirect_url"];

            HttpWebRequest reqAccessToken = (HttpWebRequest)WebRequest.Create("https://graph.facebook.com/oauth/access_token?client_id=" + appID +
                                                                            "&redirect_uri=" + url_redirect +
                                                                            "&client_secret=" + secret + "&code=" + code);
            //establecer el verbo
            reqAccessToken.Method = "GET";
            //Recuperar la respuesta
            HttpWebResponse resAccessToken = (HttpWebResponse)reqAccessToken.GetResponse();
            //Instanciar un lector
            StreamReader reader = new StreamReader(resAccessToken.GetResponseStream());
            //Leer la cadena respondida
            string TextDevuelto = reader.ReadToEnd();
            //Capturar el primer valor 
            string accessToken = TextDevuelto.Split('&')[0].Replace("access_token=","");
           
            //Recuperar información básica de usuario
            HttpWebRequest reqUsuario = (HttpWebRequest)WebRequest.Create("https://graph.facebook.com/me?access_token=" + accessToken);
            reqUsuario.Method = "GET";
            HttpWebResponse resUsuario = (HttpWebResponse)reqUsuario.GetResponse();
            reader = new StreamReader(resUsuario.GetResponseStream());

            string JsonUsuario = reader.ReadToEnd();
            //Objeto Serializador necesario
            JavaScriptSerializer jSerializer = new JavaScriptSerializer();


            try
            {
                Dominio.Facebook.UsuarioFacebook userGot = jSerializer.Deserialize<Dominio.Facebook.UsuarioFacebook>(JsonUsuario);
                //Crear Usuario
                Dominio.Usuario nuevoUsuario = new Dominio.Usuario() {Nombre=userGot.name, Apellido=userGot.last_name, Email= userGot.email, Carrera="", Ocupacion="", Password=""};
                //Usuario que devolverán los procesos de crear o modificar
                Dominio.Usuario usuarioListo = null;
                //Si el usuario no existe, entonces agregarlo
                if (obtenerUsuario(nuevoUsuario.Email) == null) 
                {                    
                    if (postToFacebook(accessToken)) 
                    {
                        usuarioListo= crearUsuario(nuevoUsuario);
                    };
                }
                else
                {
                    usuarioListo= modificarUsuario(nuevoUsuario);
                }
                return usuarioListo;
            }
            catch (Exception)
            {
                return null;                
            }
        }
        private bool postToFacebook(string accessToken)
        {
            string mensaje = "message=Yo estoy usando SlideShow!. Este servicio me permite acceder a cursos virtuales gratuitos. Como yo, tú también puedes disfrutar de estos beneficios a través de EnginZone";
            string enlace = "&link=http://www.enginzone.org";
            string imagen = "&picture=http://www.enginzone.com.pe/portal/images/enginzone/logo_enginzone.jpg";
            string caption= "&caption=La Zona de la Ingeniería";
            string name  = "&name=EnginZone";
            string postdata = mensaje + enlace + imagen + caption + name;
            byte[] data = Encoding.UTF8.GetBytes(postdata);
            HttpWebRequest reqUsuario = (HttpWebRequest)WebRequest.Create("https://graph.facebook.com/me/feed?access_token=" + accessToken);

            reqUsuario.Method = "POST";
            reqUsuario.ContentLength = data.Length;
            reqUsuario.ContentType = "application/json";
            var reqStream = reqUsuario.GetRequestStream();

            try
            {
                reqStream.Write(data, 0, data.Length);
                var resUsuario = (HttpWebResponse)reqUsuario.GetResponse();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
            
        }
        public Usuario crearUsuario(Usuario NuevoUsuario)
        {
            Usuario nuevoUsuario = new Usuario()
            {
                Email = NuevoUsuario.Email,
                Password = NuevoUsuario.Password,
                Nombre = NuevoUsuario.Nombre,
                Apellido = NuevoUsuario.Apellido,
                Ocupacion = NuevoUsuario.Ocupacion,
                Carrera = NuevoUsuario.Carrera
            };
            return this.UsuarioDAO.Crear(nuevoUsuario);
        }
        public Usuario crearUsuarioFacebook(string code)
        {
            return ProcesarUsuarioFacebook(code);
        }
        public Usuario obtenerUsuario(string email)
        {
            
            email = email.Replace("$punto$", ".");
            return this.UsuarioDAO.Obtener(email);
        }
        public Usuario modificarUsuario(Usuario UsuarioModificado)
        {
            
            Usuario oUsuario = this.obtenerUsuario(UsuarioModificado.Email);
            if (oUsuario != null)
            {
                oUsuario.Password = UsuarioModificado.Password;
                oUsuario.Nombre = UsuarioModificado.Nombre;
                oUsuario.Apellido = UsuarioModificado.Apellido;
                oUsuario.Ocupacion = UsuarioModificado.Ocupacion;
                oUsuario.Carrera = UsuarioModificado.Carrera;
                oUsuario = this.UsuarioDAO.Modificar(oUsuario);
            }
            return oUsuario;
        }
        public void eliminarUsuario(string email)
        {
            email = email.Replace("$punto$", ".");
            Usuario oUsuario = UsuarioDAO.Obtener(email);
            this.UsuarioDAO.Eliminar(oUsuario);
        }
        public List<Usuario> listarUsuarios()
        {
            return UsuarioDAO.ListarTodos().ToList();
        }
        public Usuario validarUsuario(string email, string password)
        {
            email = email.Replace("$punto$", ".");
            Usuario usuario = obtenerUsuario(email);
            if (usuario != null) 
            {
                if (usuario.Password.Equals(password)) {
                    return usuario;
                }
                else
                {
                    return null;
                }
            }
            return null;
        }
    }
}
